package org.easy.tool.common;

import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.DateUtil;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Valley
 * Created by Valley on 2023/7/14 15:39
 */
public class TimeUtil {

    /**
     * 功能：生成yyyy-MM-dd HH:mm:ss格式的当前时间字符串
     */
    public static String now() {
        return now("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 功能：生成yyyyMMddHHmmss格式的当前时间字符串提供给文件使用
     */
    public static String nowFile() {
        return now("yyyyMMddHHmmss");
    }

    /**
     * 功能：生成当前时间的毫秒值
     */
    public static long nowMS() {
        return new Date().getTime();
    }

    /**
     * 功能：生成yyyy-MM-dd格式的当前时间字符串
     */
    public static String today() {
        return now("yyyy-MM-dd");
    }

    /**
     * 功能：生成yyyy-MM-dd格式的昨天日期
     */
    public static String yesterday() {
        return yesterday(today());
    }

    /**
     * 功能：生成指定日期的昨天日期
     */
    public static String yesterday(String today) {
        return LocalDate.parse(today).minusDays(1).toString();
    }

    /**
     * 功能：获取过去指定天数的日期
     */
    public static List<String> lastDays(int dayLen) {
        return lastDays(today(), dayLen);
    }

    /**
     * 功能：获取过去指定天数的日期
     */
    public static List<String> lastDays(String date, int dayLen) {
        List<String> days = new ArrayList<>();
        for (int i = 0; i < dayLen; i++) {
            String yesterday = yesterday(date);
            days.add(yesterday);
            date = yesterday;
        }
        return days;
    }

    /**
     * 功能：生成yyyy-MM-dd格式的明天日期
     */
    public static String tomorrow() {
        return tomorrow(today());
    }

    /**
     * 功能：生成指定日期的明天日期
     */
    public static String tomorrow(String today) {
        return LocalDate.parse(today).plusDays(1).toString();
    }

    /**
     * 功能：获取未来指定天数的日期
     */
    public static List<String> futureDays(int dayLen) {
        return futureDays(today(), dayLen);
    }

    /**
     * 功能：获取未来指定天数的日期
     */
    public static List<String> futureDays(String date, int dayLen) {
        List<String> days = new ArrayList<>();
        for (int i = 0; i < dayLen; i++) {
            String yesterday = tomorrow(date);
            days.add(yesterday);
            date = yesterday;
        }
        return days;
    }

    /**
     * 功能：生成yyyy年MM月dd日格式的当前时间字符串
     */
    public static String todayYMD() {
        return now("yyyy年MM月dd日");
    }

    /**
     * 功能：生成指定格式的当前时间字符串
     */
    public static String now(String pattern) {
        return timeToStr(new Date(), pattern);
    }

    /**
     * 功能：生成指定时间指定格式的当前时间字符串
     */
    public static String timeToStr(Date date, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

    /**
     * 功能： 生成当前农历日期字符串
     */
    public static String todayCN() {
        ChineseDate date = new ChineseDate(new Date());
        return date.toString();
    }

    /**
     * 功能： 生成指定农历日期字符串,默认yyyy-MM-dd格式
     */
    public static String todayCN(String normalDate) {
        Date date = strToDate(normalDate);
        ChineseDate dateCN = new ChineseDate(date);
        return dateCN.toString();
    }

    /**
     * 功能：将指定格式字符串转化为时间，支持yyyy-MM-dd格式
     */
    public static Date strToDate(String date) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            return format.parse(date);
        } catch (Exception e) {
            return new Date();
        }
    }

    /**
     * 功能：将指定格式字符串转化为时间戳，支持2017-08-15 00:00:00格式
     */
    public static long getStrTime(String date) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.parse(date).getTime();
    }

}
